# 台账业务类
import datetime
import glob
import os

import numpy as np
import pandas as pd
from tools.问卷 import 问卷


class LedgerServer:

    def __init__(self, data_dir_path):
        self.area_code_index = None
        self.area_point_pivot_table = None
        zy_list_path = []
        a_list_path = []
        b_list_path = []
        m_list_path = []
        # zh_list_path = []
        csv_files = glob.glob(os.path.join(data_dir_path + "/", '*.csv'))
        for csv_file in csv_files:
            if '账页51' in csv_file or 'zy.' in csv_file:
                zy_list_path.append(csv_file)
            elif 'a.' in csv_file or 'A卷' in csv_file or '问卷A' in csv_file:
                a_list_path.append(csv_file)
            elif 'B卷' in csv_file or '问卷B' in csv_file:
                b_list_path.append(csv_file)
            # elif 'zhuhu.' in csv_file:
            #     zh_list_path.append(csv_file)
            elif 'm.' in csv_file or 'M卷' in csv_file or '问卷M' in csv_file:
                m_list_path.append(csv_file)

        zy_df = self.__load_df(zy_list_path)
        a_df = self.__load_df(a_list_path, None)
        b_df = self.__load_df(b_list_path, None)
        m_df = self.__load_df(m_list_path, None)
        # zh_df = self.__load_df(zh_list_path)

        # 格式化数据
        self.format_df(a_df, ["sid", "coln", "scode", "coun", "年", "季度"],
                       ["SID", "COLN", "SCODE", "COUN", "YEAR", "TASK"])
        self.format_df(b_df, ["sid", "coln", "scode", "coun", "年", "季度"],
                       ["SID", "COLN", "SCODE", "COUN", "YEAR", "TASK"])

        if "SID" in m_df.keys():
            # 外网平台 M 卷 组装 SID
            m_df["SID"] = m_df["SID"].astype(str) + "0" + m_df["COLN"].astype(str)

        self.format_df(m_df, ["sid", "coln", "scode", "coun", "年", "季度"],
                       ["SID", "COLN", "SCODE", "COUN", "YEAR", "TASK"])

        # self.format_df(m_df,["sid", "coln", "scode", "coun", "年", "季度"],["SID", "COLN", "SCODE", "COUN", "YEAR", "TASK"])

        # 设置账页点码
        zy_df["point"] = zy_df["样本编码"].apply(lambda scode: str(scode)[0:str(scode).find(".")]).astype(int)
        b_df["point"] = b_df["SCODE"].apply(lambda scode: str(scode)[0:str(scode).find(".")]).astype(int)
        m_df["point"] = m_df["SCODE"].apply(lambda scode: str(scode)[0:str(scode).find(".")]).astype(int)

        zy_df = zy_df.loc[:, ["//样本ID", "县码", "月", "编码", "数量", "金额", "数量2", "point", "样本编码"]]
        m_df = m_df.loc[:, ["SID", "COUN", "SCODE", "M202", "point"]]
        # zh_df = zh_df.loc[:,["//住户标识","户主名称"]]

        # 获取账页月份
        self.zy_months = list(zy_df["月"].drop_duplicates())
        # 获取账页点位
        self.zy_point = list(zy_df["point"].unique())

        # 账页全部透视表 不包含点码
        self.house_df = zy_df.pivot_table(index=('//样本ID'), columns=['月', '编码'], values=['金额'],
                                          aggfunc='sum').fillna(0)

        # 获取每月编码索引
        self.code_month_index = {}

        for month in self.zy_months:
            # 添加每月的编码索引
            self.code_month_index[month] = self.编码索引(self.house_df.loc[:, ("金额", month)].columns)
            # self.code_month_index[str(month)] = month
        self.zy = zy_df
        self.A卷 = a_df
        self.B卷 = b_df
        self.M卷 = m_df
        # self.zh = zh_df
        # 当前年份
        self.now_year = datetime.datetime.now().year
        # 当前月份
        self.now_month = datetime.datetime.now().month

    def format_df(self, df: pd.DataFrame, pre=[], after=[]):
        """
        格式化 问卷
        :param df: 数据集
        :param pre: 格式前
        :param after: 格式后
        :return:
        """
        for i, item in enumerate(pre):
            if item in df.columns:
                df.rename(columns={
                    item: after[i]
                }, inplace=True)

    def generate_pivot_tables(self, area_code):
        """
        生成对应透视表(汇总透视表、区域包含点位透视表)
        :param area_code: 区域代码
        :return: None
        """
        data_df = self.zy[self.zy["县码"] == area_code].copy() if not area_code == 510500 else self.zy.copy()

        # 获取账页月份
        zy_months = list(data_df["月"].drop_duplicates())
        # 获取账页点位
        zy_point = sorted(list(data_df["point"].unique())) if not area_code == 510500 else None

        # 排除泸州市 全市的情况  泸州市全市 不需要点码透视表 只需要汇总透视表即可
        if area_code == 510500:
            # 区域汇总透视表
            self.area_pivot_table = data_df.pivot_table(index=('//样本ID'), columns=['月', '编码'],
                                                        values=['数量', '金额', '数量2'], aggfunc='sum').fillna(0)
            # 区域点位透视表
            self.area_point_pivot_table = None
            # 生成对应索引
            self.area_code_index = self.generate_code_index(["数量", "金额", "数量2"], zy_months, self.area_pivot_table)
            self.area_point_index = None
        else:
            # 区域汇总透视表
            self.area_pivot_table = data_df.pivot_table(index=('//样本ID'), columns=['月', '编码'],
                                                        values=['数量', '金额', '数量2'], aggfunc='sum').fillna(0)
            # 区域点位透视表
            self.area_point_pivot_table = data_df.pivot_table(index=('//样本ID'), columns=['point', '月', '编码'],
                                                              values=['数量', '金额', '数量2'], aggfunc='sum').fillna(0)
            # 生成对应索引
            self.area_code_index = self.generate_code_index(["数量", "金额", "数量2"], zy_months, self.area_pivot_table)
            self.area_point_index = self.generate_code_index(["数量", "金额", "数量2"], zy_months,
                                                             self.area_point_pivot_table, zy_point)
        return self

    def generate_code_index(self, heard, months, table, points=None):
        """
        生成编码索引
        :param heard: 大表头  ["数量", "金额", "数量2"]
        :param months: 月份
        :param table: 透视表
        :param points: 点位
        :return: 索引字典
        """
        res = {}
        for h in heard:
            h_res = {}
            if points == None:
                for month in months:
                    h_res[month] = self.编码索引(table.loc[:, (h, month)].columns)

            else:
                for point in points:
                    pint_res = {}
                    for month in months:
                        pint_res[month] = self.编码索引(table.loc[:, (h, point, month)].columns)
                    h_res[point] = pint_res
            res[h] = h_res
        return res

    def 编码索引(self, series):
        """
        获取编码索引
        :param series:
        :return:
        """
        返回 = {}
        for i, v in enumerate(series):
            while v > 1:
                if 返回.get(v, None) is None:
                    返回[v] = [i]
                else:
                    返回[v].append(i)
                v = v // 10
        return 返回

    def __load_df(self, file_paths=[], skiprows=[0]):
        """
        加载数据到DataFrame中
        :param file_paths: 路径集合
        :return: pd.DataFrame 对象
        """
        temp = pd.DataFrame([])
        if len(file_paths) == 0 or file_paths is None:
            return temp
        for file_path in file_paths:
            temp_data_frame = pd.read_csv(file_path, encoding='gbk', low_memory=False, skiprows=skiprows)
            temp = pd.concat([temp, temp_data_frame], axis=0, ignore_index=True)
        return temp

    # ***************** 处理业务方法 ******************************#
    ## 调查户基本信息情况表1
    def 调查户基本信息情况表1(self, house_id) -> pd.DataFrame:
        """
        调查户基本信息情况表1
        :param house_id: 调查户SID
        :return: 二维数组 pd.DataFrame
        """
        """
        本期成员变动情况   A102
        姓名      A101
        年龄      A105 计算
        与户主关系      A103
        何种医疗保险      A111
        是否在校学生      A112
        过去三个月居住时间      A115
        是否常住成员      A119
        有无共享收入      A124
        是否离退休人员      A201
        何种养老保险      A202
        是否从业过      A204
        就业状况      A205
        主要行业      A206
        主要职业      A207
        工作时间      A208
        """
        temp = self.A卷[self.A卷["SID"] == house_id].copy()
        res = temp.loc[:,
              ("A100", "A102", "A101", "A105", "A103", "A111", "A112", "A115", "A119", "A124", "A201", "A202", "A204",
               "A205", "A206", "A207", "A208",)]

        res = self.__问卷遍历格式化(res, ["A111", "A202", "A105", "A119", "A204"])
        # res = res.sort_values(by='A100', ascending=True)
        res["A208"] = res["A208"].fillna(0).astype(int)
        # 格式年龄
        res["A105"] = res["A105"].apply(self.__calculate_age)
        # 格式化 是否常住成员 A119
        res["A119"] = res["A119"].apply(lambda x: pd.NA if pd.isna(x) else "常住" if int(x) == 1 else "非常住")
        # 格式化  是否从业过  A204
        res["A204"] = res["A204"].apply(lambda x: pd.NA if pd.isna(x) else "从业" if int(x) == 1 else "未从业")

        res["A202"] = res["A202"].apply(lambda x: self.format_mult("A202", x))
        res["A111"] = res["A111"].apply(lambda x: self.format_mult("A111", x))

        res.reset_index(drop=True, inplace=True)
        # 转置
        res = res.T
        res.reset_index(drop=True, inplace=True)
        return res

    ## 调查户基本信息情况表2
    def 调查户基本信息情况表2(self, house_id) -> pd.Series:
        """
        调查户基本信息情况表2
        :param house_id: 住户ID
        :return: 一维数组
        """
        """
            "B105",
            "B106",
            "B108",
            "B110_2",
            "B112",
            "B111",
            "B111_2",
            "B112_2",
            "B113",
            "B114",
            "B115",
            "B116",
            "B201",
            "B201_1",
            "B202",
            "B203",
            "B204",
            "B205",
            "B206",
            "B207",
            "B208",
            "B209",
            "B210",
            "B213",
            "B214",
            "B215",
            "B216",
            "B218",
            "B221",
            "B222",
            "B223",
            "B225",
            "B226"
        """
        temp = self.B卷[self.B卷["SID"] == house_id].copy()
        res = temp.loc[:,
              ("B105", "B106", "B108", "B110_2", "B112", "B111", "B111_2", "B112_2", "B113", "B114", "B115", "B116",
               "B201", "B201_1", "B202", "B203", "B204", "B205", "B207", "B208", "B209", "B210", "B213", "B214", "B216",
               "B218", "B221", "B222", "B223", "B225", "B206", "B215", "B226")]

        # 格式化
        res = self.__问卷遍历格式化(res, ["B116"])
        res["B116"] = res["B116"].apply(self.format_B116)
        return res

    def format_B116(self, data: str):
        da = str(data)
        if pd.isna(data) or len(da) == 0:
            return pd.NA

        items = da.split("^")

        res_str = ""

        for item in items:
            res_str += 问卷.get_item("B116").get("选项").get(item) + "、"
        return res_str

    def format_mult(self, code, data: str):
        da = str(data)
        if pd.isna(data) or len(da) == 0:
            return pd.NA
        res_str = ""
        if len(da) > 1 and '^' in da:
            items = da.split("^")
            for item in items:
                it = str(int(float(item)))
                res_str += 问卷.get_item(code).get("选项").get(it) + "、"
        elif len(da) >1:
            items = str(int(float(da)))
            for item in items:
                it = str(item)
                res_str += 问卷.get_item(code).get("选项").get(it) + "、"


        return res_str

    # ***************** 收入 ******************************#
    ## 居民收入调查现金账逻辑关系审核表
    def 居民收入调查现金账逻辑关系审核表(self, point=None, house_id=None) -> pd.DataFrame:
        # 获取账页月份
        """
        居民收入调查现金账逻辑关系审核表
        :param house_id:  住户SID
        :return: 每月数据
        """
        """
        工资性收入210???	                                    210
        按月发放的工资210111                                    210111
        补发工资210121                                    210121
        不按月发放的工资210131                                    210131
        其他工资2102??                                    2102
        交纳所得税513???                                    513
        个人缴纳的养老保险532111                                    532111
        个人缴纳的医疗保险532211                                    532211
        个人缴纳的失业保险532311                                    532311
        个人缴纳的住房公积金532411                                    532411
        个人缴纳的职业年金532511                                    532511
        其他社会保障支出532911                                    532911
    实物账	单位的实物和服务41????                                    41
        政府的实物和服务42????                                    42
        从社会实物和服务43????                                    43
    经营性收入22????+12????	                                    22+12
    经营性净收入=经营收入-经营成本	                                    22+12-13-51
        一产收入12????                                    12
        一产成本13????                                    13
        二三产收入22????                                    22
        二三产成本51????                                    51
    财产性收入23????	                                    23
    财产净收入=财产性收入-财产性支出	                                    23-52
    财产支出	其他生活贷款利息支出521911                                    521911
        住房贷款利息支出521111                                    521111
    住房利息支出和住房本金支出是配套账页	归还住房贷款本金560611                                    560611
        借贷性支出560???                                    560
    转移性收入240???	                                    240
    转移净收入=转移性收入-转移性支出	                                    24-53
    (一)养老金或离退休金2401???	                                    401
        离退休人员养老金或离退休金240111                                    240111
        城乡居民基本养老保险240121                                    240121
        其他养老金240191                                    240191
    (二)社会救济和补助2402???	                                    402
        最低生活保障费240211                                    240211
        五保户救助金240211                                    240211
        定期发放的抚恤金240251                                    240251
        医疗救助专项补贴240261                                    240261
        残疾人两项补贴240281                                    240281
        其他社会救济收入240291                                    240291
    (三)政策性生产补贴2403??	                                    2403
        农业支持保护补贴240311                                    240311
        畜牧业补贴240316                                    240316
        其他农业生产补贴240319                                    240319
    (五)政策性生活补贴2404??	                                    2404
    (五)报销医疗费240511	                                    240511
        住院医疗总费用（一般有报销）372211                                    372211
    (六)外出从业人员寄回带回收入2406??	                                    2406
        城镇寄带回收入240621                                    240621
        农村寄带回收入240611                                    240611
    （七）赡养收入240711	                                    240711
    (八)其他经常转移收入2408??	                                    2408
    不算入可支配收入的项目	非收入所得250???                                    250
          博彩所得250211                                    250211
          调查补贴250261                                    250261
        借贷性所得260???                                    260
    转移性支出	1.个人所得税531???                                    531
        2.社会保障支出532???                                    532
        3.外来从业人员寄给家人的支出533???                                    533
        4.赡养支出534111                                    534111
        5.其他转移性支出539???                                    539
        """
        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []
            # 工资性收入210???
            data_list.append(self.get_zy_code_sum(210, month, 2, point, house_id))

            # 按月发放的工资 210111
            data_list.append(self.get_zy_code_sum(210111, month, 2, point, house_id))

            # 补发工资 210121
            data_list.append(self.get_zy_code_sum(210121, month, 2, point, house_id))

            # 不按月发放的工资 210131
            data_list.append(self.get_zy_code_sum(210131, month, 2, point, house_id))

            # 其他工资 2102??
            data_list.append(self.get_zy_code_sum(2102, month, 2, point, house_id))

            # 交纳所得税 513???
            data_list.append(self.get_zy_code_sum(513, month, 2, point, house_id))

            # 个人缴纳的养老保险 532111
            data_list.append(self.get_zy_code_sum(532111, month, 2, point, house_id))

            # 个人缴纳的医疗保险 532211
            data_list.append(self.get_zy_code_sum(532211, month, 2, point, house_id))

            # 个人缴纳的失业保险 532311
            data_list.append(self.get_zy_code_sum(532311, month, 2, point, house_id))

            # 个人缴纳的住房公积金 532411
            data_list.append(self.get_zy_code_sum(532411, month, 2, point, house_id))

            # 个人缴纳的职业年金 532511
            data_list.append(self.get_zy_code_sum(532511, month, 2, point, house_id))

            # 其他社会保障支出 532911
            data_list.append(self.get_zy_code_sum(532911, month, 2, point, house_id))

            # 单位的实物和服务 41????
            data_list.append(self.get_zy_code_sum(41, month, 2, point, house_id))

            # 政府的实物和服务 42????
            data_list.append(self.get_zy_code_sum(42, month, 2, point, house_id))

            # 从社会实物和服务 43????
            data_list.append(self.get_zy_code_sum(43, month, 2, point, house_id))

            # 经营性收入 22???? + 12????
            data_list.append(self.get_zy_code_sum(22, month, 2, point, house_id) +
                             self.get_zy_code_sum(12, month, 2, point, house_id))

            # 经营性净收入=经营收入 - 经营成本
            data_list.append(self.get_zy_code_sum(22, month, 2, point, house_id) +
                             self.get_zy_code_sum(12, month, 2, point, house_id) -
                             self.get_zy_code_sum(13, month, 2, point, house_id) -
                             self.get_zy_code_sum(51, month, 2, point, house_id))

            # 一产收入 12????
            data_list.append(self.get_zy_code_sum(12, month, 2, point, house_id))

            # 一产成本 13????
            data_list.append(self.get_zy_code_sum(13, month, 2, point, house_id))

            # 二三产收入 22????
            data_list.append(self.get_zy_code_sum(22, month, 2, point, house_id))

            # 二三产成本 51????
            data_list.append(self.get_zy_code_sum(51, month, 2, point, house_id))

            # 财产性收入 23????
            data_list.append(self.get_zy_code_sum(23, month, 2, point, house_id))

            # 财产净收入=财产性收入-财产性支出
            data_list.append(self.get_zy_code_sum(23, month, 2, point, house_id) -
                             self.get_zy_code_sum(52, month, 2, point, house_id))

            # 其他生活贷款利息支出 521911
            data_list.append(self.get_zy_code_sum(521911, month, 2, point, house_id))

            # 住房贷款利息支出 521111
            data_list.append(self.get_zy_code_sum(521111, month, 2, point, house_id))

            # 归还住房贷款本金 560611
            data_list.append(self.get_zy_code_sum(560611, month, 2, point, house_id))

            # 借贷性支出 560???
            data_list.append(self.get_zy_code_sum(560, month, 2, point, house_id))

            # 转移性收入 240???
            data_list.append(self.get_zy_code_sum(240, month, 2, point, house_id))

            # 转移净收入=转移性收入-转移性支出  24-53
            data_list.append(self.get_zy_code_sum(24, month, 2, point, house_id) -
                             self.get_zy_code_sum(53, month, 2, point, house_id))

            # (一)养老金或离退休金  2401???
            data_list.append(self.get_zy_code_sum(2401, month, 2, point, house_id))

            # 离退休人员养老金或离退休金 240111
            data_list.append(self.get_zy_code_sum(240111, month, 2, point, house_id))

            # 城乡居民基本养老保险 240121
            data_list.append(self.get_zy_code_sum(240121, month, 2, point, house_id))

            # 其他养老金 240191
            data_list.append(self.get_zy_code_sum(240191, month, 2, point, house_id))

            # (二)社会救济和补助 2402???
            data_list.append(self.get_zy_code_sum(2402, month, 2, point, house_id))

            # 最低生活保障费 240211
            data_list.append(self.get_zy_code_sum(240211, month, 2, point, house_id))

            # 五保户救助金  240221
            data_list.append(self.get_zy_code_sum(240221, month, 2, point, house_id))

            # 定期发放的抚恤金 240251
            data_list.append(self.get_zy_code_sum(240251, month, 2, point, house_id))

            # 医疗救助专项补贴 240261
            data_list.append(self.get_zy_code_sum(240261, month, 2, point, house_id))

            # 残疾人两项补贴 240281
            data_list.append(self.get_zy_code_sum(240281, month, 2, point, house_id))

            # 其他社会救济收入 240291
            data_list.append(self.get_zy_code_sum(240291, month, 2, point, house_id))

            # (三)政策性生产补贴 2403??
            data_list.append(self.get_zy_code_sum(2403, month, 2, point, house_id))

            # 农业支持保护补贴 240311
            data_list.append(self.get_zy_code_sum(240311, month, 2, point, house_id))

            # 畜牧业补贴 240316
            data_list.append(self.get_zy_code_sum(240316, month, 2, point, house_id))

            # 其他农业生产补贴 240319
            data_list.append(self.get_zy_code_sum(240319, month, 2, point, house_id))

            # (五)政策性生活补贴 2404??
            data_list.append(self.get_zy_code_sum(2404, month, 2, point, house_id))

            # (五)报销医疗费 240511
            data_list.append(self.get_zy_code_sum(240511, month, 2, point, house_id))

            # 住院医疗总费用（一般有报销）372211
            data_list.append(self.get_zy_code_sum(372211, month, 2, point, house_id))

            # (六)外出从业人员寄回带回收入 2406??
            data_list.append(self.get_zy_code_sum(2406, month, 2, point, house_id))

            # 城镇寄带回收入 240621
            data_list.append(self.get_zy_code_sum(240621, month, 2, point, house_id))

            # 农村寄带回收入 240611
            data_list.append(self.get_zy_code_sum(240611, month, 2, point, house_id))

            # （七）赡养收入 240711
            data_list.append(self.get_zy_code_sum(240711, month, 2, point, house_id))

            # (八)其他经常转移收入 2408??
            data_list.append(self.get_zy_code_sum(2408, month, 2, point, house_id))

            # 非收入所得 250???
            data_list.append(self.get_zy_code_sum(250, month, 2, point, house_id))

            #   博彩所得 250211
            data_list.append(self.get_zy_code_sum(250211, month, 2, point, house_id))

            #   调查补贴 250261
            data_list.append(self.get_zy_code_sum(250261, month, 2, point, house_id))

            # 借贷性所得 260???
            data_list.append(self.get_zy_code_sum(260, month, 2, point, house_id))

            # 1.个人所得税 531???
            data_list.append(self.get_zy_code_sum(531, month, 2, point, house_id))

            # 2.社会保障支出 532???
            data_list.append(self.get_zy_code_sum(532, month, 2, point, house_id))

            # 3.外来从业人员寄给家人的支出 533???
            data_list.append(self.get_zy_code_sum(533, month, 2, point, house_id))

            # 4.赡养支出 534111
            data_list.append(self.get_zy_code_sum(534111, month, 2, point, house_id))

            # 5.其他转移性支出 539???
            data_list.append(self.get_zy_code_sum(539, month, 2, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

        # if house_id is None:
        #     # 全区域查询(江阳就江阳数据、泸州市就泸州市数据、一切以提供数据说话)
        #     # 获取12月数据
        #     data_list = []
        #     # 工资性收入
        #     data_list.append(self.get_zy_code_sum(210,12,house_id))
        #     # 经营性收入
        #     data_list.append(self.get_zy_code_sum(22, 12, house_id) +
        #                      self.get_zy_code_sum(12, 12, house_id))
        #     # 财产性收入
        #     data_list.append(self.get_zy_code_sum(23, 12, house_id))
        #     # 离退休金
        #     data_list.append(self.get_zy_code_sum(240111, 12, house_id))
        #     # 城乡养老保险
        #     data_list.append(self.get_zy_code_sum(240121, 12, house_id))
        #     # 城镇寄带回收入
        #     data_list.append(self.get_zy_code_sum(240621, 12, house_id))
        #     # 农村寄带回收入
        #     data_list.append(self.get_zy_code_sum(240611, 12, house_id))
        #     # 赡养收入
        #     data_list.append(self.get_zy_code_sum(240711, 12, house_id))
        #     # 其他转移收入
        #     data_list.append(self.get_zy_code_sum(240191, 12, house_id) +
        #                      self.get_zy_code_sum(2402, 12, house_id) +
        #                      self.get_zy_code_sum(2403, 12, house_id) +
        #                      self.get_zy_code_sum(2404, 12, house_id) +
        #                      self.get_zy_code_sum(2405, 12, house_id)
        #                      )
        #     # 调查补贴
        #     data_list.append(self.get_zy_code_sum(250261, 12, house_id))
        #
        #     res[12] = data_list

        return res.round(4)

    # ***************** 消费 ******************************#
    ## 住户调查食品烟酒消费逻辑关系审核表
    def 住户调查食品烟酒消费逻辑关系审核表(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查食品烟酒消费逻辑关系审核表
        :param house_id: 住户SID
        :return: 返回表数据
        """
        """
        大米              311014
        食用油            31104?
        面粉制品           311018
        薯类              31102?
        豆类              31103?
        蔬菜              31105?
        肉类              31106?
        禽类              31107?
        水产品             31108?
        蛋类              31109?
        奶类              31110?
        干鲜瓜果类         31111?
        糖果糕点类         31112?
        饮料              31113?
        调味品            311141
        烟酒              312???
        在外饮食服务        313???
        婚丧礼金收入        250221
        婚丧宴请支出        552511
        """
        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []
            # 大米	311014
            data_list.append(self.get_zy_code_sum(311014, month, 2, point, house_id))

            # 食用油	31104?
            data_list.append(self.get_zy_code_sum(31104, month, 2, point, house_id))

            # 面粉制品	311018
            data_list.append(self.get_zy_code_sum(311018, month, 2, point, house_id))

            # 薯类	31102?
            data_list.append(self.get_zy_code_sum(31102, month, 2, point, house_id))

            # 豆类	31103?
            data_list.append(self.get_zy_code_sum(31103, month, 2, point, house_id))

            # 蔬菜	31105?
            data_list.append(self.get_zy_code_sum(31105, month, 2, point, house_id))

            # 肉类	31106?
            data_list.append(self.get_zy_code_sum(31106, month, 2, point, house_id))

            # 禽类	31107?
            data_list.append(self.get_zy_code_sum(31107, month, 2, point, house_id))

            # 水产品	31108?
            data_list.append(self.get_zy_code_sum(31108, month, 2, point, house_id))

            # 蛋类	31109?
            data_list.append(self.get_zy_code_sum(31109, month, 2, point, house_id))

            # 奶类	31110?
            data_list.append(self.get_zy_code_sum(31110, month, 2, point, house_id))

            # 干鲜瓜果类	31111?
            data_list.append(self.get_zy_code_sum(31111, month, 2, point, house_id))

            # 糖果糕点类	31112?
            data_list.append(self.get_zy_code_sum(31112, month, 2, point, house_id))

            # 饮料	31113?
            data_list.append(self.get_zy_code_sum(31113, month, 2, point, house_id))

            # 调味品	311141
            data_list.append(self.get_zy_code_sum(311141, month, 2, point, house_id))

            # 烟酒	312???
            data_list.append(self.get_zy_code_sum(312, month, 2, point, house_id))

            # 在外饮食服务	313???
            data_list.append(self.get_zy_code_sum(313, month, 2, point, house_id))

            # 婚丧礼金收入	250221
            data_list.append(self.get_zy_code_sum(250221, month, 2, point, house_id))

            # 婚丧宴请支出	552511
            data_list.append(self.get_zy_code_sum(552511, month, 2, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

    ## 住户调查生活消费逻辑关系审核表
    def 住户调查生活消费逻辑关系审核表(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查生活消费逻辑关系审核表
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        衣类	321???
        鞋类	322???
        租房.房屋维修.物管费等	331+332
        水费	333111
        电费	333211
        生活燃料	3333??
        家用纺织品	343???
        洗涤卫生用品	344111
        个人护理用品	345???
        家庭服务	346???
        交通费	3512??
        交通工具拥有 不做 
        交通工具燃料	3513??
        交通工具使用及维修(含税）	3514??
        机动车辆保险	541111
        电话费	352211
        上网费	352311
        一揽子通信服务	352251
        邮费+其他通信服务费	352241+352291
        """

        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            # 衣类	321???
            data_list.append(self.get_zy_code_sum(321, month, 2, point, house_id))

            # 鞋类	322???
            data_list.append(self.get_zy_code_sum(322, month, 2, point, house_id))

            # 租房.房屋维修.物管费等	331+332
            data_list.append(self.get_zy_code_sum(331, month, 2, point, house_id) +
                             self.get_zy_code_sum(332, month, 2, point, house_id)
                             )

            # 水费	333111
            data_list.append(self.get_zy_code_sum(333111, month, 2, point, house_id))

            # 电费	333211
            data_list.append(self.get_zy_code_sum(333211, month, 2, point, house_id))

            # 生活燃料	3333??
            data_list.append(self.get_zy_code_sum(3333, month, 2, point, house_id))

            # 家用纺织品	343???
            data_list.append(self.get_zy_code_sum(343, month, 2, point, house_id))

            # 洗涤卫生用品	344111
            data_list.append(self.get_zy_code_sum(344111, month, 2, point, house_id))

            # 个人护理用品	345???
            data_list.append(self.get_zy_code_sum(345, month, 2, point, house_id))

            # 家庭服务	346???
            data_list.append(self.get_zy_code_sum(346, month, 2, point, house_id))

            # 交通费	3512??
            data_list.append(self.get_zy_code_sum(3512, month, 2, point, house_id))

            # 交通工具拥有  TODO 不做
            # data_list.append(self.get_zy_code_sum(311014, month, 2, point,house_id))

            # 交通工具燃料	3513??
            data_list.append(self.get_zy_code_sum(3513, month, 2, point, house_id))

            # 交通工具使用及维修(含税）	3514??
            data_list.append(self.get_zy_code_sum(3514, month, 2, point, house_id))

            # 机动车辆保险	541111
            data_list.append(self.get_zy_code_sum(541111, month, 2, point, house_id))

            # 电话费	352211
            data_list.append(self.get_zy_code_sum(352211, month, 2, point, house_id))

            # 上网费	352231
            data_list.append(self.get_zy_code_sum(352231, month, 2, point, house_id))

            # 一揽子通信服务	352251
            data_list.append(self.get_zy_code_sum(352251, month, 2, point, house_id))

            # 邮费+其他通信服务费	352241+352291
            data_list.append(self.get_zy_code_sum(352241, month, 2, point, house_id) +
                             self.get_zy_code_sum(352291, month, 2, point, house_id)
                             )
            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

    ## 住户调查文娱、医疗、美发等消费逻辑关系审核表
    def 住户调查文娱_医疗_美发等消费逻辑关系审核表(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查文娱_医疗_美发等消费逻辑关系审核表
        :param point: 点位
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        教育	361???
        文化娱乐	362???
          其中团体旅游	362311
          其中文化娱乐服务	3623??
          其中有线电视费	362351
        药品	371111
        滋补保健品	371211
        门诊医疗	372111
        住院医疗	372211
        其他用品	381???
        美容美发洗浴	382211
        旅馆住宿费	382111
        博彩支出	552111
        婚丧嫁娶礼金支出	552211

        """

        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            # 教育	361???
            data_list.append(self.get_zy_code_sum(361, month, 2, point, house_id))

            # 文化娱乐	362???
            data_list.append(self.get_zy_code_sum(362, month, 2, point, house_id))

            #   其中团体旅游	362311
            data_list.append(self.get_zy_code_sum(362311, month, 2, point, house_id))

            #   其中文化娱乐服务	3623??
            data_list.append(self.get_zy_code_sum(3623, month, 2, point, house_id))

            #   其中有线电视费	362351
            data_list.append(self.get_zy_code_sum(362351, month, 2, point, house_id))

            # 药品	371111
            data_list.append(self.get_zy_code_sum(371111, month, 2, point, house_id))

            # 滋补保健品	371211
            data_list.append(self.get_zy_code_sum(371211, month, 2, point, house_id))

            # 门诊医疗	372111
            data_list.append(self.get_zy_code_sum(372111, month, 2, point, house_id))

            # 住院医疗	372211
            data_list.append(self.get_zy_code_sum(372211, month, 2, point, house_id))

            # 其他用品	381???
            data_list.append(self.get_zy_code_sum(381, month, 2, point, house_id))

            # 美容美发洗浴	382211
            data_list.append(self.get_zy_code_sum(382211, month, 2, point, house_id))

            # 旅馆住宿费	382111
            data_list.append(self.get_zy_code_sum(382111, month, 2, point, house_id))

            # 博彩支出	552111
            data_list.append(self.get_zy_code_sum(552111, month, 2, point, house_id))

            # 婚丧嫁娶礼金支出	婚丧嫁娶礼金支出	552211
            data_list.append(self.get_zy_code_sum(552211, month, 2, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

    ## 住户调查农业支出逻辑关系审核表（农村点）
    def 住户调查农业支出逻辑关系审核表_农村点(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查农业支出逻辑关系审核表_农村点
        :param point: 点位
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        稻谷种子	131121
        玉米种子	131131
        其他种子及种苗	131141+131191
        自产自用种子	1511??/公斤
        农药	131341+132341
        肥料	131311+132311
        薄膜	131351
        生产经营雇工	131141+132411
        机收机耕费	131451
        可能是错误编码	135???
        购建农业生产性固定资产	14????
        """
        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            # 稻谷种子	131121
            data_list.append(self.get_zy_code_sum(131121, month, 2, point, house_id))

            # 玉米种子	131131
            data_list.append(self.get_zy_code_sum(131131, month, 2, point, house_id))

            # 其他种子及种苗	131141+131191
            data_list.append(self.get_zy_code_sum(131141, month, 2, point, house_id) +
                             self.get_zy_code_sum(131191, month, 2, point, house_id))

            # 自产自用种子	1511??/公斤
            data_list.append(self.get_zy_code_sum(1511, month, 1, point, house_id))

            # 农药	131341+132341
            data_list.append(self.get_zy_code_sum(131341, month, 2, point, house_id) +
                             self.get_zy_code_sum(132341, month, 2, point, house_id))

            # 肥料	131311+132311
            data_list.append(self.get_zy_code_sum(131311, month, 2, point, house_id) +
                             self.get_zy_code_sum(132311, month, 2, point, house_id))

            # 薄膜	131351
            data_list.append(self.get_zy_code_sum(131351, month, 2, point, house_id))

            # 生产经营雇工	131141+132411
            data_list.append(self.get_zy_code_sum(131141, month, 2, point, house_id) +
                             self.get_zy_code_sum(132411, month, 2, point, house_id))

            # 机收机耕费	131451
            data_list.append(self.get_zy_code_sum(131451, month, 2, point, house_id))

            # 可能是错误编码	135???
            data_list.append(self.get_zy_code_sum(135, month, 2, point, house_id))

            # 购建农业生产性固定资产	14????
            data_list.append(self.get_zy_code_sum(14, month, 2, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

    ## 住户调查畜牧业支出逻辑关系审核表（农村点）
    def 住户调查畜牧业支出逻辑关系审核表_农村点(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查畜牧业支出逻辑关系审核表_农村点
        :param point: 点位
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        幼畜	1331??
        饲料	1332??
        兽药	133311
        畜禽防疫费	133441
        生产经营雇工	133411
        牧业其他费用	133491
        渔业支出	134???

        
        """

        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            # 幼畜	1331??
            data_list.append(self.get_zy_code_sum(1331, month, 2, point, house_id))

            # 饲料	1332??
            data_list.append(self.get_zy_code_sum(1332, month, 2, point, house_id))

            # 兽药	133311
            data_list.append(self.get_zy_code_sum(133311, month, 2, point, house_id))

            # 畜禽防疫费	133441
            data_list.append(self.get_zy_code_sum(133441, month, 2, point, house_id))

            # 生产经营雇工	133411
            data_list.append(self.get_zy_code_sum(133411, month, 2, point, house_id))

            # 牧业其他费用	133491
            data_list.append(self.get_zy_code_sum(133491, month, 2, point, house_id))

            # 渔业支出	134???
            data_list.append(self.get_zy_code_sum(134, month, 2, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

    ## 住户调查自产自用消费逻辑关系审核表（农村点）
    def 住户调查自产自用消费逻辑关系审核表_农村点(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查自产自用消费逻辑关系审核表_农村点
        :param point: 点位
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        稻谷	161012
        玉米	161013
        红薯	161021
        马铃薯	161022
        豆类	16103?
        油菜籽	161053
        甘蔗	161071
        动物油	163083
        露地蔬菜	161091
        自产自用酒	161201
        水果	1611??
        家畜	16301?
        家禽	16302?
        蛋类	16303?
        养殖鱼.虾	16401?
        捕捞鱼.虾	16402?
        蜂蜜	163081
        柴	166311

        """
        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            # 稻谷	161012
            data_list.append(self.get_zy_code_sum(161012, month, 1, point, house_id))

            # 玉米	161013
            data_list.append(self.get_zy_code_sum(161013, month, 1, point, house_id))

            # 红薯	161021
            data_list.append(self.get_zy_code_sum(161021, month, 1, point, house_id))

            # 马铃薯	161022
            data_list.append(self.get_zy_code_sum(161022, month, 1, point, house_id))

            # 豆类	16103?
            data_list.append(self.get_zy_code_sum(16103, month, 1, point, house_id))

            # 油菜籽	161053
            data_list.append(self.get_zy_code_sum(161053, month, 1, point, house_id))

            # 甘蔗	161071
            data_list.append(self.get_zy_code_sum(161071, month, 1, point, house_id))

            # 动物油	163083
            data_list.append(self.get_zy_code_sum(163083, month, 1, point, house_id))

            # 露地蔬菜	161091
            data_list.append(self.get_zy_code_sum(161091, month, 1, point, house_id))

            # 自产自用酒	161201
            data_list.append(self.get_zy_code_sum(161201, month, 1, point, house_id))

            # 水果	1611??
            data_list.append(self.get_zy_code_sum(1611, month, 1, point, house_id))

            # 家畜	16301?
            data_list.append(self.get_zy_code_sum(16301, month, 1, point, house_id))

            # 家禽	16302?
            data_list.append(self.get_zy_code_sum(16302, month, 1, point, house_id))

            # 蛋类	16303?
            data_list.append(self.get_zy_code_sum(16303, month, 1, point, house_id))

            # 养殖鱼.虾	16401?
            data_list.append(self.get_zy_code_sum(16401, month, 1, point, house_id))

            # 捕捞鱼.虾	16402?
            data_list.append(self.get_zy_code_sum(16402, month, 1, point, house_id))

            # 蜂蜜	163081
            data_list.append(self.get_zy_code_sum(163081, month, 1, point, house_id))

            # 柴	166311
            data_list.append(self.get_zy_code_sum(166311, month, 1, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)

        return res.round(4)

    ## 住户调查自产自用畜牧业饲料逻辑关系审核表（农村点）
    def 住户调查自产自用畜牧业饲料逻辑关系审核表_农村点(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查自产自用畜牧业饲料逻辑关系审核表_农村点
        :param point: 点位
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        稻谷	153121
        玉米	153131
        红薯/其他粮食.公斤	153191
        红薯/其他粮食.元    153191
        青饲料重量	153211
        饲料牧草	153311

        """

        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            #  稻谷	153121
            data_list.append(self.get_zy_code_sum(153121, month, 1, point, house_id))

            # 玉米	153131
            data_list.append(self.get_zy_code_sum(153131, month, 1, point, house_id))

            # 红薯/其他粮食.公斤 153191
            data_list.append(self.get_zy_code_sum(153191, month, 1, point, house_id))

            # 红薯/其他粮食. 元 153191
            data_list.append(self.get_zy_code_sum(153191, month, 2, point, house_id))

            # 青饲料重量	153211
            data_list.append(self.get_zy_code_sum(153211, month, 1, point, house_id))

            # 饲料牧草	153311
            data_list.append(self.get_zy_code_sum(153311, month, 1, point, house_id))

            res[month] = data_list
        # 全年
        res["全年"] = res.sum(axis=1)
        return res.round(4)

    ## 住户调查农作物产量逻辑关系审核表（农村点）
    def 住户调查农作物产量逻辑关系审核表_农村点(self, point=None, house_id=None) -> pd.DataFrame:
        """
        住户调查农作物产量逻辑关系审核表_农村点
        :param point: 点位
        :param house_id: 住户SID
        :return: 表数据
        """
        """
        稻谷    （亩/公斤）	111012
	
        玉米    （亩/公斤）	111013
            
        高粱    （亩/公斤）	111014
            
        红薯    （亩/公斤）	111021
            
        马铃薯  （亩/公斤）	111022
            
        大豆    （亩/公斤）	111031
            
        其他豆类（亩/公斤）	111039
            
        花生    （亩/公斤）	111051
            
        油菜籽  （亩/公斤）	111053
	
        先亩后公斤
        """
        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = []

            # 稻谷    （亩）	111012
            data_list.append(self.get_zy_code_sum(111012, month, 1, point, house_id))

            # 稻谷    （公斤）	111012
            data_list.append(self.get_zy_code_sum(111012, month, 3, point, house_id))

            # 玉米    （亩）	111013
            data_list.append(self.get_zy_code_sum(111013, month, 1, point, house_id))

            # 玉米    （公斤）	111013
            data_list.append(self.get_zy_code_sum(111013, month, 3, point, house_id))

            # 高粱    （亩）	111014
            data_list.append(self.get_zy_code_sum(111014, month, 1, point, house_id))

            # 高粱    （公斤）	111014
            data_list.append(self.get_zy_code_sum(111014, month, 3, point, house_id))

            # 红薯    （亩）	111021
            data_list.append(self.get_zy_code_sum(111021, month, 1, point, house_id))

            # 红薯    （公斤）	111021
            data_list.append(self.get_zy_code_sum(111021, month, 3, point, house_id))

            # 马铃薯  （亩）	111022
            data_list.append(self.get_zy_code_sum(111022, month, 1, point, house_id))

            # 马铃薯  （公斤）	111022
            data_list.append(self.get_zy_code_sum(111022, month, 3, point, house_id))

            # 大豆    （亩）	111031
            data_list.append(self.get_zy_code_sum(111031, month, 1, point, house_id))

            # 大豆    （公斤）	111031
            data_list.append(self.get_zy_code_sum(111031, month, 3, point, house_id))

            # 其他豆类（亩）	111039
            data_list.append(self.get_zy_code_sum(111039, month, 1, point, house_id))

            # 其他豆类（公斤）	111039
            data_list.append(self.get_zy_code_sum(111039, month, 3, point, house_id))

            # 花生    （亩）	111051
            data_list.append(self.get_zy_code_sum(111051, month, 1, point, house_id))

            # 花生    （公斤）	111051
            data_list.append(self.get_zy_code_sum(111051, month, 3, point, house_id))

            # 油菜籽  （亩）	111053
            data_list.append(self.get_zy_code_sum(111053, month, 1, point, house_id))

            # 油菜籽  （公斤）	111053
            data_list.append(self.get_zy_code_sum(111053, month, 3, point, house_id))

            res[month] = data_list

        # 全年
        res["全年"] = res.sum(axis=1)
        return res.round(4)

    # ***************** 四项收入八项支出 ******************************#

    def 四收八支(self, point=None, house_id=None) -> pd.DataFrame:
        res = pd.DataFrame(columns=[12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], index=None)

        for month in self.zy_months:
            data_list = [0] * 14
            data_list[1] = (
                    self.get_zy_code_sum(21, month, 2, point, house_id) +
                    self.get_zy_code_sum(41, month, 2, point, house_id) +
                    self.get_zy_code_sum(42, month, 2, point, house_id) +
                    self.get_zy_code_sum(43, month, 2, point, house_id)
            )
            data_list[2] = (
                    self.get_zy_code_sum(12, month, 2, point, house_id) +
                    self.get_zy_code_sum(22, month, 2, point, house_id) -
                    self.get_zy_code_sum(13, month, 2, point, house_id) -
                    self.get_zy_code_sum(51, month, 2, point, house_id)
            )
            data_list[3] = (
                    self.get_zy_code_sum(23, month, 2, point, house_id) -
                    self.get_zy_code_sum(52, month, 2, point, house_id)
            )
            data_list[4] = (
                    self.get_zy_code_sum(24, month, 2, point, house_id) -
                    self.get_zy_code_sum(53, month, 2, point, house_id)
            )
            data_list[0] = sum(data_list[1:5])

            data_list[6] = (
                    self.get_zy_code_sum(31, month, 2, point, house_id) +
                    self.get_zy_code_sum(41, month, 2, point, house_id) +
                    self.get_zy_code_sum(42, month, 2, point, house_id) +
                    self.get_zy_code_sum(43, month, 2, point, house_id)
            )
            data_list[7] = self.get_zy_code_sum(32, month, 2, point, house_id)
            data_list[8] = self.get_zy_code_sum(33, month, 2, point, house_id)
            data_list[9] = self.get_zy_code_sum(34, month, 2, point, house_id)
            data_list[10] = self.get_zy_code_sum(35, month, 2, point, house_id)
            data_list[11] = self.get_zy_code_sum(36, month, 2, point, house_id)
            data_list[12] = self.get_zy_code_sum(37, month, 2, point, house_id)
            data_list[13] = self.get_zy_code_sum(38, month, 2, point, house_id)
            data_list[5] = sum(data_list[6:14])

            res[month] = data_list

        # 全年
        res["全年"] = res.sum(axis=1)
        return res.round(4)

    def get_zy_code_sum(self, code, month, 数量金额数量=2, point=None, house_id=None):
        """
        获取账页指标的和
        :param code: 账页编码
        :param month:  月份
        :param 数量金额数量2: 1  数量    2  金额  3   数量2
        :param point: 点位
        :param house_id: 住户SID
        :return: 和的内容
        """
        数量金额数量_temp = ["数量", "金额", "数量2"]
        数量金额数量_value = 数量金额数量_temp[数量金额数量 - 1]

        code_index = self.area_code_index[数量金额数量_value][month] if point is None else \
            self.area_point_index[数量金额数量_value][point][month]
        column_index = code_index.get(code)
        #  [132,133,134,135,136]
        if column_index is None:
            return 0

        if house_id is None:
            # 分区 \ 分点
            if not point is None:
                # 分点求和取值
                return self.area_point_pivot_table.loc[:, (数量金额数量_value, point, month)].iloc[:,
                       column_index].sum().sum()
            # 分区分区求和
            return self.area_pivot_table.loc[:, (数量金额数量_value, month)].iloc[:, column_index].sum().sum()
        else:
            # 分户求和
            b = self.area_pivot_table.loc[house_id, (数量金额数量_value, month)]
            a = self.area_pivot_table.loc[house_id, (数量金额数量_value, month)].iloc[column_index].sum()
            return a

        # if column_index is None :
        #     return 0
        # if house_id is None:
        #     # 全区查找账页求和
        #     return self.house_df.loc[:, (数量金额数量_temp[数量金额数量 - 1], month)].iloc[:, column_index].sum().sum()
        # return self.house_df.loc[house_id,(数量金额数量_temp[数量金额数量 - 1],month)].iloc[column_index].sum()

    def __问卷遍历格式化(self, df, ignore=[]):
        """
        问卷遍历格式化，当问卷编码有对应选项，格式化对应选项，否则不进行操作
        df: pd.DataFrame columns 以问卷编码作为列索引
        :param df: 要格式化的数据
        :return: 格式化后数据
        """
        # 获取所有key
        res = df.copy()
        keys = res.keys()
        for key in keys:
            if key not in ignore:
                is_select = 问卷.get_item(key).get("选项")
                res[key] = res[key].apply(
                    lambda x: pd.NA if pd.isna(x) else x if is_select is None else is_select.get(str(int(x))))
        return res

    # 计算年龄
    def __calculate_age(self, year_month):
        age = (self.now_year - 1) - year_month // 100
        if self.now_month > year_month % 100:
            age += 1
        return age

    # 获取有效区域
    def get_area_code(self):
        return list(self.zy["县码"].drop_duplicates())

    # 获取有效区有效点位
    def get_area_point(self, area_code):
        return sorted(list(self.zy[self.zy["县码"] == area_code]["point"].drop_duplicates()))

    # 点位获取对应户SID
    def get_houseIds_by_point(self, area, point):
        """
        通过区域 + 点位获取对应的住户sid集合
        :param area: 区域代码
        :param point: 点位
        :return: sid集合   sid  scode + 名字     *秋华  2.013.01h
        """
        # 获取账页 有效户 --- 账页中存在的户
        zy_cp = self.zy[(self.zy["县码"] == area) & (self.zy["point"] == point)]
        zy_cp: pd.DataFrame = zy_cp.drop_duplicates(subset=["//样本ID"])[["//样本ID", "样本编码"]]
        # m = self.M卷[self.M卷["SID"].isin(zy_cp)]
        # print(self.M卷)
        zh = zy_cp.merge(right=self.M卷, how="inner", left_on=["//样本ID"], right_on=["SID"])[
            ["//样本ID", "SCODE", "M202"]]
        zh["名称+编码"] = zh["M202"] + "  " + zh["SCODE"]

        return zh[["//样本ID", "名称+编码"]]


if __name__ == '__main__':
    # l = LedgerServer(data_dir_path=r"C:\Users\m\Desktop\2025年国家点")
    # l.generate_pivot_tables(510502)
    # print(l.四收八支(point=4,house_id="510502103003101H17801"))
    s = "24"

    s1 = "2^4"
    for a in s:
        print(a)
